#region File Description
//-----------------------------------------------------------------------------
// MessageBoxScreen.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion

#region Using Statements
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using GameStateManagement;
#endregion

namespace Frogger_Game
{
    /// <summary>
    /// A popup message box screen, used to display "are you sure?"
    /// confirmation messages.
    /// </summary>
    class MessageBoxScreen : Microsoft.Xna.Framework.DrawableGameComponent
    {
        #region Fields

        string message;
        Texture2D gradientTexture;
        Texture2D blankTexture;
        SpriteBatch spriteBatch;
        SpriteFont font;
        InputState input;
        InputButtons ib;

        #endregion

        #region Events

        public event EventHandler<PlayerIndexEventArgs> Accepted;
        public event EventHandler<PlayerIndexEventArgs> Cancelled;

        #endregion

        #region Initialization


        /// <summary>
        /// Constructor automatically includes the standard "A=ok, B=cancel"
        /// usage text prompt.
        /// </summary>
        public MessageBoxScreen(Game game)
            : base(game)
        {

        }


        /// <summary>
        /// Constructor lets the caller specify whether to include the standard
        /// "A=ok, B=cancel" usage text prompt.
        /// </summary>
        public MessageBoxScreen(Game game, string message, bool includeUsageText) : base(game)

        {
            const string usageText = "\nA button, Space, Enter = ok" +
                                     "\nB button, Esc = cancel"; 
            
            if (includeUsageText)
                this.message = message + usageText;
            else
                this.message = message;

        }


        ///// <summary>
        ///// Loads graphics content for this screen. This uses the shared ContentManager
        ///// provided by the Game class, so the content will remain loaded forever.
        ///// Whenever a subsequent MessageBoxScreen tries to load this same content,
        ///// it will just get back another reference to the already loaded data.
        ///// </summary>
        //public override void Activate(bool instancePreserved)
        //{
        //    if (!instancePreserved)
        //    {
        //        gradientTexture = Game.Content.Load<Texture2D>("gradient");
        //    }
        //}


        #endregion

        #region Initialize

        public override void Initialize()
        {
            //Game.Components.Add(new Input(Game));
            font = Game.Content.Load<SpriteFont>("menufont");

            input = (InputState)Game.Services.GetService(typeof(InputState));
            ib = (InputButtons)Game.Services.GetService(typeof(InputButtons));
            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            blankTexture = Game.Content.Load<Texture2D>("blank");
            gradientTexture = Game.Content.Load<Texture2D>("gradient");

        }


        #endregion


        #region Handle Input


        /// <summary>
        /// Responds to user input, accepting or cancelling the message box.
        /// </summary>
        public override void Update(GameTime gameTime)
        {
            PlayerIndex playerIndex;

            // We pass in our ControllingPlayer, which may either be null (to
            // accept input from any player) or a specific index. If we pass a null
            // controlling player, the InputState helper returns to us which player
            // actually provided the input. We pass that through to our Accepted and
            // Cancelled events, so they can tell which player triggered them.
            if (ib.menuSelect.Evaluate(input, null, out playerIndex))
            {
                // Raise the accepted event, then exit the message box.
                if (Accepted != null)
                    Accepted(this, new PlayerIndexEventArgs(playerIndex));

            }
            else if (ib.menuCancel.Evaluate(input, null, out playerIndex))
            {
                // Raise the cancelled event, then exit the message box.
                if (Cancelled != null)
                    Cancelled(this, new PlayerIndexEventArgs(playerIndex));

            }
        }


        #endregion

        #region Draw


        /// <summary>
        /// Draws the message box.
        /// </summary>
        public override void Draw(GameTime gameTime)
        {

            // Darken down any other screens that were drawn beneath the popup.
            spriteBatch.Begin();
            spriteBatch.Draw(blankTexture, GraphicsDevice.Viewport.Bounds, Color.Black * 0.6f);
            spriteBatch.End();

            // Center the message text in the viewport.
            Viewport viewport = GraphicsDevice.Viewport;
            Vector2 viewportSize = new Vector2(viewport.Width, viewport.Height);
            Vector2 textSize = font.MeasureString(message);
            Vector2 textPosition = (viewportSize - textSize) / 2;

            // The background includes a border somewhat larger than the text itself.
            const int hPad = 32;
            const int vPad = 16;

            Rectangle backgroundRectangle = new Rectangle((int)textPosition.X - hPad,
                                                          (int)textPosition.Y - vPad,
                                                          (int)textSize.X + hPad * 2,
                                                          (int)textSize.Y + vPad * 2);

            // Fade the popup alpha during transitions.
            Color color = Color.White;

            spriteBatch.Begin();

            // Draw the background rectangle.
            spriteBatch.Draw(gradientTexture, backgroundRectangle, color);

            // Draw the message box text.
            spriteBatch.DrawString(font, message, textPosition, color);

            spriteBatch.End();
        }


        #endregion
    }
}
